// 专门用来封装实例对象
import AxiosHttpRequest from './AxiosHttp'
import { AxiosRequestHeaders } from '@ohos/axios'
import router from '@ohos.router'
import { base_url } from '../config/index'
import promptAction from '@ohos.promptAction'

// 准备变量记录路由地址
let routerPath: string = ''

// 用我们自己封装的类去创建实例
const instance = new AxiosHttpRequest({
  baseURL: base_url,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json' // => 你根据你的业务逻辑去判断, 我目前暂时使用的事 json-server, 所以必须要传递 json 类型
  } as AxiosRequestHeaders,
  // 你如果需要拦截器
  interceptorHooks: {
    // 因为我们返回的都是 promise 对象,  所以所有的内容都是异步函数
    requestInterceptor: async config => {

      // console.log(`needLoading : ${ config.needLoading }`)

      // todo: 判断, 如果当前 config 内有 needLoading 参数, 那么我们就开启 loading 效果
      // 只要把 AppStorage 内的 showLoading 数据存储为 true
      if (config.needLoading) AppStorage.SetOrCreate('showLoading', true)

      // 因为我们需要再全局去添加一些内容
      // 没必要判断, 因为如果使用当前实例的人没有写, 那么 routerPath 本身就是 ''
      routerPath = config.needRouter

      return config
    },
    requestInterceptorCatch: async err => {

      return err
    },
    // 响应拦截器
    responseInterceptor: async response => {
      console.log('DeepCode : 响应成功 ' + JSON.stringify(response))
      // 登录或者注册出错
      if (response.data.state === 400 || response.data.state === 401) {
        // 给用户提示
        promptAction.showToast({ message: response.data.msg })
        return Promise.resolve(response.data)
      }

      // todo: 关闭 loading 效果
      // 只要把 AppStorage 内的 showLoading 数据存储为 false
      // 假设用户请求的时候, 没有设置 needLoading, 不需要关, 因为根本就没开
      //   但是, 因为没开, 本身就是 false, 我现在设置为 false, 就是没有设置
      setTimeout(() => {
        AppStorage.SetOrCreate('showLoading', false)

        if (routerPath) router.pushUrl({ url: routerPath })
      }, 1500)

      // 因为这个是我们自己封装的响应拦截器, 如果你给回的事一个数据, 那么不能 .then
      // 所以我们需要返回一个 Promise 对象, 才能继续 .then
      return Promise.resolve(response.data)
    },
    // 响应失败的拦截器
    responseInterceptorCatch: async err => {
      console.log('DeepCode : 响应成功 ' + JSON.stringify(err))
      return Promise.reject(err)
    }
  }
})

// 导出我们的实力
export default instance

// 用户相关的基本上都要验证 token
// 商品 列表 详情 基本上都要 loading
// 提交 注册 修改密码 登录 基本上都要 dialog
// 地址 配送 订单 之类的都要 相关( 地图, 省市县联动 ) 组件